/**
 * 
 */
package nl.boektrust.btsoep.client;

import nl.boektrust.btsoep.shared.model.ISBN;
import nl.boektrust.btsoep.shared.model.ISBNReference;
import nl.boektrust.btsoep.shared.model.ISBNReferenceType;
import nl.boektrust.btsoep.shared.model.URLReference;
import nl.boektrust.btsoep.shared.model.URLReferenceType;
import nl.boektrust.btsoep.shared.model.URLReference;

import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;

/**
 * @author rao3
 *
 */
public  class EditBookVerwijzingenURLPanel extends EditBookPanel implements ClickHandler, FocusHandler, BlurHandler, ValueChangeHandler<String>, KeyPressHandler, ChangeHandler {
	private ListBox verwijzingTypeListBox = new ListBox();
	private TextBox verwijzingTextBox;
	private Button xButton = new Button("ok");;
	private URLReference urlReference;
	private boolean isNewField = false;
	int numFocusedElements = 1;
	EditBookDialog dialog;

	public EditBookVerwijzingenURLPanel(String label, URLReference urlReference, boolean isInEditMode, EditBookDialog dialog) {
		super(label, isInEditMode);
		
		this.verwijzingTypeListBox = new ListBox();
		this.dialog = dialog;
		for (URLReferenceType t : URLReferenceType.values()) {
			this.verwijzingTypeListBox.addItem(URLReferenceType.stringValue(t));			
		}
		this.verwijzingTextBox = new TextBox();
		this.verwijzingTextBox.addValueChangeHandler(this);
		this.verwijzingTypeListBox.addChangeHandler(this);
		xButton.addClickHandler(this);
		editPanel.add(this.verwijzingTypeListBox);
		editPanel.add(this.verwijzingTextBox);
		editPanel.add(xButton);
		if (urlReference != null) {
			this.setValue(urlReference);
			isNewField = false;
		} else {

			this.setValue(new URLReference());
			isNewField = true;
		}
		
		if (isInEditMode == true) {
			setToEditMode();
		} else {
			setToDisplayMode();
		}
	}
	


	public EditBookVerwijzingenURLPanel(String label, boolean isInEditMode, EditBookDialog dialog) {
		this(label, null, isInEditMode, dialog);
	}

	public EditBookVerwijzingenURLPanel(boolean isInEditMode) {
		this("", isInEditMode, null);
	}

	public EditBookVerwijzingenURLPanel(String label) {
		this(label, false, null);
	}

	public EditBookVerwijzingenURLPanel() {
		this(false);
	}
	
	boolean hasInvalidData() {
		return false;
	}



	/*@Override
	void setToEditMode() {
		super.clearPanel();
		HorizontalPanel panel = new HorizontalPanel();
		if (isNewField == false) {
			verwijzingTextBox.setText(urlReference.getUrl());
			// loop over all the elements in the listbox until the one is found that matches the text of the current URLReferenceType
			for (int i=0; i<verwijzingTypeListBox.getItemCount(); i++) {
				System.out.println("comparing " +verwijzingTypeListBox.getItemText(i)+ "to " + URLReferenceType.stringValue(urlReference.getUrlReferenceType()));
				if (verwijzingTypeListBox.getItemText(i).equals(URLReferenceType.stringValue(urlReference.getUrlReferenceType()))) {
					System.out.println("Setting index to "+i);
					verwijzingTypeListBox.setSelectedIndex(i);
				}
			}
		}
	
		panel.add(verwijzingTypeListBox);
		panel.add(verwijzingTextBox);
		panel.add(xButton);
		this.add(panel);
		
		xButton.addClickHandler(this);
	}*/

	/*
	@Override
	void setToDisplayMode() {
		super.clearPanel();
		if (isNewField == false) {
			theLabel = new Label(URLReferenceType.stringValue(urlReference.getUrlReferenceType())+" URL: "+urlReference.getUrl());
		} else {
			theLabel = new Label("Voeg nieuwe URL-verwijzing toe");
		}
		this.add(theLabel);
		theLabel.addClickHandler(this);		
	}
	*/
	public void onClick(ClickEvent event) {
		if (event.getSource() ==theLabel) {		
			this.toggleEditMode();
		} else if (event.getSource() == xButton) {
			setInEditMode(false);
			this.setToDisplayMode();
		}
		
	}

	public void onBlur(BlurEvent event) {
		numFocusedElements--;
		if (numFocusedElements <= 0) {
			super.toggleEditMode();
		}
	}

	public void onFocus(FocusEvent event) {
		numFocusedElements++;
		
	}
	

	public void onValueChange(ValueChangeEvent event) {
		if (event.getSource()== verwijzingTextBox) {
			try {
				urlReference.setUrl(verwijzingTextBox.getText());
				setValue(urlReference);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} 
	}

	public void onKeyPress(KeyPressEvent event) {
	/*	if (event.getSource() == kleurTextBox || event.getSource() == zwTextBox) {
			if (Character.isLetter(event.getCharCode()) || Character.isSpace(event.getCharCode())) {
		          ((TextBox) event.getSource()).cancelKey();
		        }
		}*/
		
	}

	public void onChange(ChangeEvent event) {
		if (event.getSource() == verwijzingTypeListBox) {
			for (URLReferenceType t : URLReferenceType.values()) {
				if (URLReferenceType.stringValue(t).equals(verwijzingTypeListBox.getItemText(verwijzingTypeListBox.getSelectedIndex()))) {
					urlReference.setUrlReferenceType(t);
					setValue(urlReference);
				}
			}

		}
	}



	/**
	 * @return the urlReference
	 */
	public URLReference getUrlReference() {
		return urlReference;
	}



	/**
	 * @param urlReference the urlReference to set
	 */
	public void setUrlReference(URLReference urlReference) {
		this.urlReference = urlReference;
	}
	
	public void setValue(URLReference urlReference) {
		this.setUrlReference(urlReference);
		// set label
		if (urlReference.getUrl() == null || urlReference.getUrl().length() == 0) {
			theLabel.setText("klik om te veranderen");
		} else {
			theLabel.setText(new String(URLReferenceType.stringValue(this.urlReference.getUrlReferenceType()) + " " + urlReference.getUrl()));
		}
		// set textbox
		if (urlReference.getUrl() != null)	verwijzingTextBox.setText(urlReference.getUrl());
		// set dialog box
		for (int i=0; i<verwijzingTypeListBox.getItemCount(); i++) {
			if (verwijzingTypeListBox.getItemText(i).equals(URLReferenceType.stringValue(this.urlReference.getUrlReferenceType()))) {
				verwijzingTypeListBox.setSelectedIndex(i);
			}
		}
	}


	


}
